﻿namespace Rsdn.Janus
{
    using System;
    using System.Windows.Forms;
    using ObjectModel;
    using SmartApp;
    using TreeGrid;

    /// <summary>
    /// Summary description for DraftBox.
    /// </summary>
    public class DraftboxFeature : Feature, IGetData
    {
        private readonly IServiceProvider _provider;

        private static readonly DraftboxFeature _instance = new DraftboxFeature(ApplicationManager.Instance.ServiceProvider);

        /// <summary>
        /// Initializes a new instance of the <see cref="DraftboxFeature"/> class.
        /// </summary>
        /// <param name="provider">The provider.</param>
        private DraftboxFeature(IServiceProvider provider)
        {
            _provider = provider;
            _description = "Черновики";                               //MLHIDE

            IIncomingFolderUpdate folderUpdate = (IIncomingFolderUpdate)provider.GetService(typeof(IIncomingFolderUpdate));
            folderUpdate.AddUpdate(this);

        }
        
        /// <summary>
        /// Gets the instance.
        /// </summary>
        /// <value>The instance.</value>
        public static DraftboxFeature Instance
        {
            get { return _instance; }
        }

        /// <summary>
        /// Gets the key.
        /// </summary>
        /// <value>The key.</value>
        public override string Key
        {
            get { return "DraftBox"; }                                //MLHIDE
        }

        /// <summary>
        /// Проверяет нужно ли обновление объекта если статус сообщения изменился.
        /// Требуется если нужно обновить одновременно несколько папок (форумов).
        /// Функция должна быть достаточно быстрой иначе проще перечитать всю папку.
        /// </summary>
        /// <param name="msg">Проверяемое сообщение.</param>
        /// <returns>
        ///     <c>true</c> если обновление необходимо; иначе, <c>false</c>.
        /// </returns>
        public override bool IsUpdateNeed(object msg)
        {
            // don't need to update this future folder if any message changed. 
            return false;
        }

        /// <summary>
        /// Обновляет содержимое с учетом <see cref="Rsdn.Janus.ObjectModel.IFeature.IsUpdateNeed"/>
        /// Если полное обновление не нужно обновляем только строку названия при необходимости (если там есть различные счетчики)
        /// </summary>
        public override void Refresh()
        {
            IDraftboxManager draftboxManager = _provider.GetRequiredService<IDraftboxManager>();
            draftboxManager.RefreshMessages();
        }

        /// <summary>
        /// Gets the index of the image.
        /// </summary>
        /// <value>The index of the image.</value>
        public override int ImageIndex
        {
            get { return Features.Instance.OutboxImageIndex; }
        }

        #region IFeatureGui

        /// <summary>
        /// Creates the GUI control.
        /// </summary>
        /// <returns></returns>
        protected override Control CreateGuiControl()
        {
            IDraftboxManager draftboxManager = _provider.GetRequiredService<IDraftboxManager>();
            return (Control)draftboxManager.OutboxForm;
        }

        #endregion IFeatureGui

        #region IGetData
        /// <summary>
        /// Gets the data.
        /// </summary>
        /// <param name="nodeInfo">The node info.</param>
        /// <param name="cellData">The cell data.</param>
        void IGetData.GetData(NodeInfo nodeInfo, CellInfo[] cellData)
        {
            IDraftboxManager draftboxManager = _provider.GetRequiredService<IDraftboxManager>();
            cellData[0].Text = Description;
            cellData[0].ImageIndex = ImageIndex;
            cellData[1].Text = string.Format(
                "//{0}",                                              //MLHIDE
                draftboxManager.NewMessages.Count == 0 ? string.Empty : draftboxManager.NewMessages.Count.ToString()
                );

            //nodeInfo.Highlight = draftboxManager.NewMessages.Count > 0;
        }
        #endregion IGetData
    }
}